home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 49 / Amiga Format CD49 (2000-01-17)(Future Publishing)(GB)(Track 1 of 3)[!][issue 2000-02].iso / -serious- / programming / e / lsestuff / elements.e < prev    next >
Text File  |  1999-11-29  |  6KB  |  246 lines

  1. OPT MODULE
  2.  
  3. MODULE 'leifoo/nm'
  4. MODULE 'leifoo/nmList'
  5. MODULE 'leifoo/nmIList'
  6. MODULE 'mymods/bits'
  7.  
  8. EXPORT CONST LEVEL_ON=1, LEVEL_OFF=2, LEVEL_X=4
  9. SET ONBIT, OFFBIT, XBIT
  10.  
  11. EXPORT OBJECT element OF nmI
  12.    PRIVATE
  13.    inputs:PTR TO CHAR
  14.    nrofinputs:CHAR
  15.    output:CHAR
  16.    transferlist:PTR TO nmList
  17. ENDOBJECT
  18.  
  19. ->the connectnodes in element.connectlist
  20. OBJECT e_transfer OF nm
  21.    toelement:PTR TO element
  22.    toinput
  23. ENDOBJECT
  24.  
  25. PROC new(nrofinputs) OF element
  26.    self.nrofinputs := nrofinputs
  27.    self.inputs := FastNew(nrofinputs)
  28.    setAllInputsLevel(self, LEVEL_X)
  29.    self.output := LEVEL_X
  30.    NEW self.transferlist.new(NIL)
  31. ENDPROC
  32.  
  33. PROC end() OF element
  34.    FastDispose(self.inputs, self.nrofinputs)
  35.    END self.transferlist
  36. ENDPROC
  37.  
  38. PROC setAllInputsLevel(e:PTR TO element, level)
  39.    DEF a
  40.    FOR a := 0 TO e.nrofinputs - 1 DO e.inputs[a] := level
  41. ENDPROC
  42.  
  43. PROC getInputsOR(e:PTR TO element)
  44.    DEF a
  45.    DEF temp=NIL
  46.    FOR a := 0 TO e.nrofinputs - 1 DO temp := temp OR e.inputs[a]
  47. ENDPROC temp
  48.  
  49. PROC computeOutput() OF element IS EMPTY
  50.  
  51. PROC getObjectName() OF element IS 'element'
  52.  
  53. PROC setInputLevel(inputnr, level) OF element
  54.    self.inputs[inputnr] := level
  55. ENDPROC
  56.  
  57. PROC getInputLevel(inputnr) OF element IS self.inputs[inputnr]
  58.  
  59. PROC getOutputLevel() OF element IS self.output
  60.  
  61. PROC getNrOfInputs() OF element IS self.nrofinputs
  62.  
  63. PROC tickTime() OF element IS NIL
  64.  
  65. PROC transferOutput() OF element
  66.    DEF c:PTR TO e_transfer
  67.    c := self.transferlist.first()
  68.    WHILE c
  69.       c.toelement.inputs[c.toinput] := self.output
  70.       c := c.next
  71.    ENDWHILE
  72. ENDPROC
  73.  
  74. PROC setTransfer(toelement, toinput) OF element
  75.    DEF c:PTR TO e_transfer
  76.    c := findTransfer(self.transferlist, toelement, toinput)
  77.    IF c = NIL
  78.       c := self.transferlist.addLast(NEW c)
  79.    ENDIF
  80.    c.toelement := toelement
  81.    c.toinput := toinput
  82. ENDPROC
  83.  
  84. PROC unsetTransfer(toelement, toinput) OF element
  85.    DEF c:PTR TO e_transfer
  86.    c := findTransfer(self.transferlist, toelement, toinput)
  87.    IF c THEN self.transferlist.delete(c)
  88. ENDPROC
  89.  
  90. PROC clearTransfers() OF element IS self.transferlist.clear()
  91.  
  92. PROC findTransfer(clist:PTR TO nmList, toelement, toinput)
  93.    DEF c:PTR TO e_transfer
  94.    c := clist.first()
  95.    WHILE c
  96.       IF c.toelement = toelement
  97.       IF c.toinput = toinput
  98.          RETURN c
  99.       ENDIF ; ENDIF
  100.       c := c.next
  101.    ENDWHILE
  102. ENDPROC NIL
  103.  
  104.  
  105. EXPORT OBJECT not OF element ; ENDOBJECT
  106.  
  107. PROC new(nrofinputs) OF not IS SUPER self.new(1)
  108.  
  109. PROC computeOutput() OF not
  110.    DEF oldout
  111.    oldout := self.output
  112.    IF bitGet(self.inputs[0], ONBIT)
  113.       self.output := bitSet(NIL, OFFBIT)
  114.    ELSEIF bitGet(self.inputs[0], OFFBIT)
  115.      self.output := bitSet(NIL, ONBIT)
  116.    ELSE
  117.       self.output := bitSet(NIL, XBIT)
  118.    ENDIF
  119. ENDPROC IF oldout <> self.output THEN TRUE ELSE FALSE
  120.  
  121. PROC getObjectName() OF not IS 'not'
  122.  
  123. PROC getNrOfInputs() OF not IS 1
  124.  
  125. EXPORT OBJECT or OF element ; ENDOBJECT
  126.  
  127. PROC computeOutput() OF or
  128.    DEF or
  129.    DEF oldout
  130.    oldout := self.output
  131.    or := getInputsOR(self)
  132.    IF bitGet(or, ONBIT)
  133.       self.output := bitSet(NIL, ONBIT)
  134.    ELSEIF bitGet(or, XBIT)
  135.       self.output := bitSet(NIL, XBIT)
  136.    ELSE
  137.       self.output := bitSet(NIL, OFFBIT)
  138.    ENDIF
  139. ENDPROC IF oldout <> self.output THEN TRUE ELSE FALSE
  140.  
  141. EXPORT OBJECT nor OF element ; ENDOBJECT
  142.  
  143. PROC getObjectName() OF nor IS 'nor'
  144.  
  145. PROC computeOutput() OF nor
  146.    DEF or
  147.    DEF oldout
  148.    oldout := self.output
  149.    or := getInputsOR(self)
  150.    IF bitGet(or, ONBIT)
  151.       self.output := bitSet(NIL, OFFBIT)
  152.    ELSEIF bitGet(or, XBIT)
  153.       self.output := bitSet(NIL, XBIT)
  154.    ELSE
  155.       self.output := bitSet(NIL, ONBIT)
  156.    ENDIF
  157. ENDPROC IF oldout <> self.output THEN TRUE ELSE FALSE
  158.  
  159. EXPORT OBJECT and OF element ; ENDOBJECT
  160.  
  161. PROC getObjectName() OF and IS 'and'
  162.  
  163. PROC computeOutput() OF and
  164.    DEF or
  165.    DEF oldout
  166.    oldout := self.output
  167.    or := getInputsOR(self)
  168.    IF bitGet(or, OFFBIT)
  169.       self.output := bitSet(NIL, OFFBIT)
  170.    ELSEIF bitGet(or, XBIT)
  171.       self.output := bitSet(NIL, XBIT)
  172.    ELSE
  173.       self.output := bitSet(NIL, ONBIT)
  174.    ENDIF
  175. ENDPROC IF oldout <> self.output THEN TRUE ELSE FALSE
  176.  
  177.  
  178. EXPORT OBJECT nand OF element ; ENDOBJECT
  179.  
  180. PROC getObjectName() OF nand IS 'nand'
  181.  
  182. PROC computeOutput() OF nand
  183.    DEF or
  184.    DEF oldout
  185.    oldout := self.output
  186.    or := getInputsOR(self)
  187.    IF bitGet(or, OFFBIT)
  188.       self.output := bitSet(NIL, ONBIT)
  189.    ELSEIF bitGet(or, XBIT)
  190.       self.output := bitSet(NIL, XBIT)
  191.    ELSE
  192.       self.output := bitSet(NIL, OFFBIT)
  193.    ENDIF
  194. ENDPROC IF oldout <> self.output THEN TRUE ELSE FALSE
  195.  
  196. EXPORT OBJECT xor OF element ; ENDOBJECT
  197.  
  198. PROC new(nrofinputs) OF xor IS SUPER self.new(2)
  199.  
  200. PROC getObjectName() OF xor IS 'xor'
  201.  
  202. PROC getNrOfInputs() OF xor IS 2
  203.  
  204. PROC computeOutput() OF xor
  205.    DEF or
  206.    DEF oldout
  207.    oldout := self.output
  208.    or := getInputsOR(self)
  209.    IF bitGet(or, XBIT)
  210.       self.output := bitSet(NIL, XBIT)
  211.    ELSEIF self.inputs[0] <> self.inputs[1]
  212.       self.output := bitSet(NIL, OFFBIT)
  213.    ELSE
  214.       self.output := bitSet(NIL, ONBIT)
  215.    ENDIF
  216. ENDPROC IF oldout <> self.output THEN TRUE ELSE FALSE
  217.  
  218. EXPORT OBJECT delay OF element ; ENDOBJECT
  219.  
  220. PROC new(delay) OF delay
  221.    DEF a
  222.    self.output := LEVEL_X
  223.    self.inputs := FastNew(delay + 1)
  224.    FOR a := 0 TO delay DO self.inputs[a] := LEVEL_X
  225.    self.nrofinputs := delay
  226. ENDPROC
  227.  
  228. PROC getObjectName() OF delay IS 'delay'
  229.  
  230. PROC getNrOfInputs() OF delay IS 1
  231.  
  232. PROC computeOutput() OF delay
  233.    DEF or
  234.    DEF oldout
  235.    oldout := self.output
  236.    self.output := self.inputs[0]
  237. ENDPROC IF oldout <> self.output THEN TRUE ELSE FALSE
  238.  
  239. PROC tickTime() OF delay
  240.    DEF a:REG
  241.    FOR a := self.nrofinputs TO 1 STEP -1 DO self.inputs[a-1] := self.inputs[a]
  242. ENDPROC
  243.  
  244. PROC end() OF delay IS FastDispose(self.inputs, (self.nrofinputs) + 1)
  245.  
  246.